//一棵圣诞树记作根节点为 root 的二叉树，节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果： 
//
// 
// 第一层按照从左到右的顺序记录 
// 除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右，第二层为从右到左。 
// 
//
// 
//
// 示例 1： 
//
// 
//
// 
//输入：root = [8,17,21,18,null,null,6]
//输出：[[8],[21,17],[18,6]]
// 
//
// 
//
// 提示： 
//
// 
// 节点总数 <= 1000 
// 
//
// 
//
// Related Topics 树 广度优先搜索 二叉树 👍 316 👎 0


package LeetCode.editor.cn;


import java.util.*;

/**
 * @author ldltd
 * @date 2025-05-08 17:07:50
 * @description LCR 151.彩灯装饰记录 III
 
 */
 
public class CongShangDaoXiaDaYinErChaShuIiiLcof {
    public static void main(String[] args) {
    //测试代码
    CongShangDaoXiaDaYinErChaShuIiiLcof fun = new CongShangDaoXiaDaYinErChaShuIiiLcof();
    Solution solution= fun.new Solution();
        System.out.println(false^false);
        System.out.println(false^true);
        System.out.println(true^true);
        System.out.println(!true);
    }

//leetcode submit region begin(Prohibit modification and deletion)

//  Definition for a binary tree node.
  public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
  }

class Solution {
        //层次遍历 add index
    public List<List<Integer>> decorateRecord(TreeNode root) {
        if(root==null) return new ArrayList<>();
        Deque<TreeNode> q=new ArrayDeque<>();
        q.offer(root);
        List<List<Integer>> res=new ArrayList<>();
        boolean fromLeft=true;
        while (!q.isEmpty()){
            int n=q.size();
            List<Integer> t=new ArrayList<>();
            while (n>0){
                TreeNode poll = q.poll();
                if(fromLeft){
                    t.add(poll.val);
                }else {
                    t.add(0,poll.val);
                }
                if(poll.left!=null) q.offer(poll.left);
                if(poll.right!=null) q.offer(poll.right);
                n--;
            }
            fromLeft=!fromLeft;
            res.add(t);
        }
        return res;
    }
    //层序遍历 + reverse
    public List<List<Integer>> decorateRecord2(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) queue.add(root);
        while(!queue.isEmpty()) {
            List<Integer> tmp = new ArrayList<>();
            for(int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            if(res.size() % 2 == 1) Collections.reverse(tmp);
            res.add(tmp);
        }
        return res;
    }
    //层序遍历 + 双端队列（奇偶层逻辑分离）
    public List<List<Integer>> decorateRecord3(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) deque.add(root);
        while(!deque.isEmpty()) {
            // 打印奇数层
            List<Integer> tmp = new ArrayList<>();
            for(int i = deque.size(); i > 0; i--) {
                // 从左向右打印
                TreeNode node = deque.removeFirst();
                tmp.add(node.val);
                // 先左后右加入下层节点
                if(node.left != null) deque.addLast(node.left);
                if(node.right != null) deque.addLast(node.right);
            }
            res.add(tmp);
            if(deque.isEmpty()) break; // 若为空则提前跳出
            // 打印偶数层
            tmp = new ArrayList<>();
            for(int i = deque.size(); i > 0; i--) {
                // 从右向左打印
                TreeNode node = deque.removeLast();
                tmp.add(node.val);
                // 先右后左加入下层节点
                if(node.right != null) deque.addFirst(node.right);
                if(node.left != null) deque.addFirst(node.left);
            }
            res.add(tmp);
        }
        return res;
    }
    //层序遍历 + 双端队列
    public List<List<Integer>> decorateRecord4(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        List<List<Integer>> res = new ArrayList<>();
        if(root != null) queue.add(root);
        while(!queue.isEmpty()) {
            LinkedList<Integer> tmp = new LinkedList<>();
            for(int i = queue.size(); i > 0; i--) {
                TreeNode node = queue.poll();
                if(res.size() % 2 == 0) tmp.addLast(node.val);
                else tmp.addFirst(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            res.add(tmp);
        }
        return res;
    }


}
//leetcode submit region end(Prohibit modification and deletion)

}
